package impl.agentt;

import fr.irit.smac.may.lib.components.controlflow.SequentialDispatcher;
import fr.irit.smac.may.lib.components.controlflow.SequentialDispatcherImpl;
import message.EDTMessage;
import mysticedt.BehaviourP;
import mysticedt.UnePresence;

/***
 * Ceci est l'implementation du composant "UnePresence".
 * Cette implementation est generique et encapsule 
 * le composant de comportement de l'espece d'agent presence.
 * 
 * Comme le comportement des agents de cette espece peut varrier,
 * alors il est necessaire de passer au constructeur de cette implémentation
 * l'instance du comportement que l'on souhaite utiliser (cf constructor).
 * @author fanfan
 *
 */
public class UnePresenceImpl extends UnePresence{


	/*
	 * Si c'est un message d'un etudiant, je me prepare a aider un etudiant :
	 * - quel cours veut-il ? y-a-t-il encore de la place ?
	 * Sinon je me prepare a aider un enseignant :
	 * - je dois lui trouver une plage horaire lui convenant

	 * Si c'est un enseignant :
	 * - regarde ses indisponibilites, puis je peux agir
	 * Si c'est un etudiant :
	 * - cherche le creneau avec le prof et le cours qui lui convient avec une place disponible
	 * (si plus de places dans la plage horaire deja cree, obligation de creer nouvelle plage
	 * horaire, discussion avec d'autres agents Presence (prevoir les precedences...))
	 * 
	 * Si c'est un enseignant :
	 * - lui cree une plage horaire, l'initialise...
	 * - verifie si c'est OK, sinon discution avec d'autres agent Presence | 
	 * 								relance la creation d'une plage horaire
	 * Si c'est un etudiant :
	 * - l'ajoute dans une plage horaire disposant d'une place
	 */

	//ceci est l'implementation que l'agent presence utilisera.
	BehaviourP behaviorToUse;
	

	//pour instancer un composant presence il faudra fournir 
	//l'implementation du behaviour
	public UnePresenceImpl(BehaviourP behaviorToUse) {
		this.behaviorToUse = behaviorToUse;
	}

	@Override
	protected SequentialDispatcher<EDTMessage> make_dispatcher() {
		return new SequentialDispatcherImpl<EDTMessage> ();
	}

	@Override
	protected BehaviourP make_behaviour() {
		return behaviorToUse;
	}
}
